home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0257 / lib.exe / BHEAP.LIB < prev    next >
Text File  |  1992-02-11  |  12KB  |  702 lines

  1. #IF !LIB4A86
  2. #ELSE
  3. #IF !INTERN_LIB4A86_S
  4. INTERN_LIB4A86_S EQU 01
  5. JMP START
  6. #ENDIF
  7. #ENDIF
  8. BHEAPHEADER STRUC
  9. BHEAPLENGTH DW ?
  10. MAXBHEAPFREE DW ?
  11. LASTBHEAPPTR DW ?
  12. FREEBHEAPPTR DW ?
  13. BHEAPDUMMY DB ?
  14. BHEAPFLAGS DB ?
  15. BHEAPHEADERCRC DW ?
  16. BHEAPUSERDATA1 DW ?
  17. BHEAPUSERDATA2 DW ?
  18. ENDS
  19. FIRSTBHEAPPTR EQU (TYPE BHEAPHEADER)
  20. BHEAPHEADERLENGTH EQU (TYPE BHEAPHEADER)
  21. BHEAPCONTROLBLOCK STRUC
  22. BH_PREVBLOCKPTR DW ?
  23. BH_BLOCKFLAGS DW
  24. BH_NEXTBLOCKPTR DW ?
  25. ENDS
  26. BHEAPCONTROLBLOCKLENGTH EQU TYPE (BHEAPCONTROLBLOCK)
  27. BHEAPFREEBLOCK STRUC
  28. DB BHEAPCONTROLBLOCKLENGTH DUP ?
  29. BH_PREVFREEPTR DW ?
  30. BH_NEXTFREEPTR DW ?
  31. ENDS
  32. BHEAPFREEBLOCKLENGTH EQU TYPE (BHEAPFREEBLOCK)
  33. ISUSEDBHEAPBLOCK EQU 001XB
  34. ISLASTBHEAPBLOCK EQU 010XB
  35. BHEAPBLOCKISFREE EQU NOT ISUSEDBHEAPBLOCK
  36. BHEAPBLOCKISNTLAST EQU NOT ISLASTBHEAPBLOCK
  37. _BHEAPFLAGS EQU (ISUSEDBHEAPBLOCK OR ISLASTBHEAPBLOCK)
  38. _NOBHEAPFLAGS EQU NOT _BHEAPFLAGS
  39. MINBHEAPLENGTH EQU 1024XD
  40. TRYLASTPTRFIRST EQU 001H
  41. FREEPTRFIRST EQU 0FEH
  42. BIGFREEBLOCKS EQU 0FDH
  43. NOBIGFREEBLOCKS EQU 002H
  44. BHEAPFATALERROR EQU 080FFH
  45. BHEAPPOINTERERROR EQU 080FEH
  46. BHEAPFPOINTERERROR EQU 080FDH
  47. BHEAPLENGTHERROR EQU 080FCH
  48. BHEAPNOMOREBLOCKS EQU 08001H
  49. BHEAPFREEBLERROR EQU 08002H
  50. BHEAPMEMORYERROR EQU 08003H
  51. BHEAPREPAIRED EQU 08004H
  52. BHEAPSEG DW 0
  53. CHAINFREEBHEAPBLOCKS_A:
  54. MOV ES,CS:BHEAPSEG
  55. CHAINFREEBHEAPBLOCKS:
  56. CALL INTERN_CHECKBHEAPHEADER
  57. JC RET
  58. PUSH BX,CX,DX,SI,DI,DS
  59. MOV DS,ES
  60. XOR DX,DX
  61. MOV SI,FREEBHEAPPTR
  62. L00:
  63. OR SI,SI
  64. JZ >L02
  65. MOV BX,BH_PREVBLOCKPTR[SI]
  66. TEST BH_NEXTBLOCKPTR[BX],ISUSEDBHEAPBLOCK
  67. JNZ >L01
  68. XCHG BX,SI
  69. CALL INTERN_UNCHAINFREEBLOCK
  70. XCHG BX,SI
  71. ADD MAXBHEAPFREE,BHEAPCONTROLBLOCKLENGTH
  72. INC DX
  73. CALL INTERN_CONCATBHEAPBLOCKS
  74. XCHG BX,SI
  75. CMP LASTBHEAPPTR,BX
  76. IF E MOV LASTBHEAPPTR,SI
  77. L01:
  78. MOV SI,BH_NEXTFREEPTR[SI]
  79. JMP L00
  80. L02:
  81. MOV AX,DX
  82. PUSH AX
  83. CALL INTERN_CALCBHEAPHEADER
  84. POP AX
  85. POP DS,DI,SI,DX,CX,BX
  86. RET
  87. L0:
  88. MOV AX,ES:BHEAPLENGTH
  89. RET
  90. CHANGEBHEAPSIZE_A:
  91. MOV ES,CS:BHEAPSEG
  92. CHANGEBHEAPSIZE:
  93. CALL INTERN_CHECKBHEAPHEADER
  94. JC RET
  95. JCXZ L0
  96. PUSH BX,CX,DX,SI,DS
  97. MOV DS,ES
  98. AND CX,_NOBHEAPFLAGS
  99. CMP CX,BHEAPLENGTH
  100. JE >L90
  101. CMP CX,MINBHEAPLENGTH
  102. JB >L80
  103. CALL INTERN_GETMAXBHEAPPOINTER
  104. CMP AX,CX
  105. JA >L80
  106. MOV DX,BHEAPLENGTH
  107. MOV BHEAPLENGTH,CX
  108. MOV AX,CX
  109. XOR AL,AH
  110. MOV BHEAPDUMMY,AL
  111. MOV BX,LASTBHEAPPTR
  112. MOV SI,BH_NEXTBLOCKPTR[BX]
  113. TEST SI,ISUSEDBHEAPBLOCK
  114. JZ >L1
  115. CMP CX,BHEAPFREEBLOCKLENGTH
  116. JBE >L1
  117. AND BH_NEXTBLOCKPTR[BX],BHEAPBLOCKISNTLAST
  118. AND SI,_NOBHEAPFLAGS
  119. XCHG SI,BX
  120. MOV BH_PREVBLOCKPTR[BX],SI
  121. L1:
  122. OR CX,ISLASTBHEAPBLOCK
  123. MOV BH_NEXTBLOCKPTR[BX],CX
  124. L2:
  125. CALL INTERN_CALCBHEAPHEADER
  126. JC >L9
  127. L90:
  128. MOV AX,BHEAPLENGTH
  129. JMP >L9
  130. L80:
  131. MOV AX,BHEAPLENGTHERROR
  132. L8:
  133. STC
  134. L9:
  135. POP DS,SI,DX,CX,BX
  136. RET
  137. INITBHEAP:
  138. CMP CX, MINBHEAPLENGTH
  139. JAE >L1
  140. STC
  141. MOV AX,BHEAPLENGTHERROR
  142. RET
  143. L1:
  144. PUSH DS,BX,CX
  145. MOV CS:BHEAPSEG,ES
  146. PUSH ES
  147. POP DS
  148. MOV BHEAPFLAGS,0
  149. AND CX,_NOBHEAPFLAGS
  150. MOV BHEAPLENGTH,CX
  151. PUSH CX
  152. XOR CL,CH
  153. MOV BHEAPDUMMY,CL
  154. POP CX
  155. SUB CX,BHEAPCONTROLBLOCKLENGTH
  156. MOV AX,BHEAPHEADERLENGTH
  157. SUB CX,AX
  158. MOV MAXBHEAPFREE,CX
  159. MOV LASTBHEAPPTR,AX
  160. MOV BX,AX
  161. MOV BH_PREVBLOCKPTR[BX],0
  162. ADD CX,BHEAPCONTROLBLOCKLENGTH
  163. ADD CX,BX
  164. MOV BH_NEXTBLOCKPTR[BX],CX
  165. OR BH_BLOCKFLAGS[BX], ISLASTBHEAPBLOCK
  166. MOV FREEBHEAPPTR,0
  167. CALL INTERN_CHAINFREEBLOCK
  168. CALL INTERN_UPDATEBHEAPHEADER
  169. MOV AX,MAXBHEAPFREE
  170. POP CX,BX,DS
  171. RET
  172. GETBHEAPBLOCKLENGTH_A:
  173. MOV ES,CS:BHEAPSEG
  174. GETBHEAPBLOCKLENGTH:
  175. CALL INTERN_CHECKBHEAPBLOCK
  176. JC RET
  177. PUSH BX
  178. SUB BX,BHEAPCONTROLBLOCKLENGTH
  179. CALL INTERN_GETBHEAPBLOCKLENGTH
  180. POP BX
  181. RET
  182. GETFIRSTBHEAPBLOCK_A:
  183. MOV ES,CS:BHEAPSEG
  184. GETFIRSTBHEAPBLOCK:
  185. CALL INTERN_CHECKBHEAPHEADER
  186. JC RET
  187. MOV AX,FIRSTBHEAPPTR
  188. INTERN_GETBHEAPBLOCKDATA0:
  189. AND AX,_NOBHEAPFLAGS
  190. MOV BX,AX
  191. INTERN_GETBHEAPBLOCKDATA:
  192. XOR AX,AX
  193. CALL INTERN_GETBHEAPBLOCKLENGTH
  194. ADD BX,BHEAPCONTROLBLOCKLENGTH
  195. TEST ES:BH_BLOCKFLAGS[BX]-BHEAPCONTROLBLOCKLENGTH,ISUSEDBHEAPBLOCK
  196. CLC
  197. RET
  198. GETNEXTBHEAPBLOCK_A:
  199. MOV ES,CS:BHEAPSEG
  200. GETNEXTBHEAPBLOCK:
  201. CALL INTERN_CHECKBHEAPBLOCK
  202. JC RET
  203. MOV AX,ES:BH_NEXTBLOCKPTR[BX]-BHEAPCONTROLBLOCKLENGTH
  204. TEST AX,ISLASTBHEAPBLOCK
  205. JZ INTERN_GETBHEAPBLOCKDATA0
  206. L8:
  207. MOV AX,BHEAPNOMOREBLOCKS
  208. STC
  209. RET
  210. GETPREVBHEAPBLOCK_A:
  211. MOV ES,CS:BHEAPSEG
  212. GETPREVBHEAPBLOCK:
  213. CALL INTERN_CHECKBHEAPBLOCK
  214. JC RET
  215. MOV AX,ES:BH_PREVBLOCKPTR[BX]-BHEAPCONTROLBLOCKLENGTH
  216. OR AX,AX
  217. JZ L8
  218. JMP SHORT INTERN_GETBHEAPBLOCKDATA0
  219. GETLASTBHEAPBLOCK_A:
  220. MOV ES,CS:BHEAPSEG
  221. GETLASTBHEAPBLOCK:
  222. CALL INTERN_CHECKBHEAPHEADER
  223. JC RET
  224. MOV AX,ES:LASTBHEAPPTR
  225. JMP INTERN_GETBHEAPBLOCKDATA0
  226. GETMAXBHEAPPOINTER_A:
  227. MOV ES,CS:BHEAPSEG
  228. GETMAXBHEAPPOINTER:
  229. CALL INTERN_CHECKBHEAPHEADER
  230. JC RET
  231. INTERN_GETMAXBHEAPPOINTER:
  232. PUSH BX
  233. MOV BX,ES:LASTBHEAPPTR
  234. MOV AX,ES:BH_NEXTBLOCKPTR[BX]
  235. AND AX,_NOBHEAPFLAGS
  236. TEST ES:BH_BLOCKFLAGS[BX],ISUSEDBHEAPBLOCK
  237. JNZ >L1
  238. LEA AX,[BX+BHEAPFREEBLOCKLENGTH+4]
  239. L1:
  240. POP BX
  241. RET
  242. GETBHEAPMEMAVAIL_A:
  243. MOV ES,CS:BHEAPSEG
  244. GETBHEAPMEMAVAIL:
  245. CALL INTERN_CHECKBHEAPHEADER
  246. JC RET
  247. PUSH BX,SI,DI,DS
  248. MOV DS,ES
  249. XOR DX,DX
  250. XOR DI,DI
  251. XOR SI,SI
  252. MOV BX,FREEBHEAPPTR
  253. L0:
  254. OR BX,BX
  255. JZ >L2
  256. CALL INTERN_CHECKFREEBLOCK
  257. JC >L8
  258. INC SI
  259. CALL INTERN_GETBHEAPBLOCKLENGTH
  260. CMP CX,DI
  261. IF A MOV DI,CX
  262. ADD DX,CX
  263. MOV BX,BH_NEXTFREEPTR[BX]
  264. JMP L0
  265. L2:
  266. MOV CX,DI
  267. MOV AX,SI
  268. L8:
  269. POP DS,DI,SI,BX
  270. RET
  271. RELEASEBHEAPMEM_A:
  272. MOV ES,CS:BHEAPSEG
  273. RELEASEBHEAPMEM:
  274. CALL INTERN_CHECKBHEAPBLOCK
  275. JC RET
  276. PUSH BX,CX,DX,DS,SI
  277. MOV DS,ES
  278. MOV SI,LASTBHEAPPTR
  279. MOV AX,BH_NEXTBLOCKPTR[SI]
  280. SUB BX,BHEAPCONTROLBLOCKLENGTH
  281. MOV BH_NEXTBLOCKPTR[BX],AX
  282. OR BH_BLOCKFLAGS[BX],ISUSEDBHEAPBLOCK
  283. CALL INTERN_CALCBHEAPHEADER
  284. POP SI,DS,DX,CX,BX
  285. JNC >L1
  286. RET
  287. FREEBHEAPMEM_A:
  288. MOV ES,CS:BHEAPSEG
  289. FREEBHEAPMEM:
  290. CALL INTERN_CHECKBHEAPBLOCK
  291. JC RET
  292. TEST ES:BH_BLOCKFLAGS[BX]-BHEAPCONTROLBLOCKLENGTH ,ISUSEDBHEAPBLOCK
  293. JNZ >L1
  294. MOV AX,BHEAPFREEBLERROR
  295. STC
  296. RET
  297. L1:
  298. PUSH SI,DI,CX,BX,DS
  299. PUSH ES
  300. POP DS
  301. SUB BX,BHEAPCONTROLBLOCKLENGTH
  302. MOV DI,BH_NEXTBLOCKPTR[BX]
  303. AND DI,_NOBHEAPFLAGS
  304. MOV SI,BH_PREVBLOCKPTR[BX]
  305. CALL INTERN_GETBHEAPBLOCKLENGTH
  306. ADD MAXBHEAPFREE,CX
  307. TEST BHEAPFLAGS,NOBIGFREEBLOCKS
  308. JNZ >L2
  309. OR SI,SI
  310. JZ >L1
  311. TEST BH_BLOCKFLAGS[SI],ISUSEDBHEAPBLOCK
  312. JNZ >L1
  313. ADD MAXBHEAPFREE,BHEAPCONTROLBLOCKLENGTH
  314. CMP LASTBHEAPPTR,BX
  315. IF E MOV LASTBHEAPPTR,SI
  316. XCHG BX,SI
  317. CALL INTERN_UNCHAINFREEBLOCK
  318. CALL INTERN_CONCATBHEAPBLOCKS
  319. L1:
  320. TEST BH_NEXTBLOCKPTR[BX],ISLASTBHEAPBLOCK
  321. JNZ >L2
  322. TEST BH_BLOCKFLAGS[DI],ISUSEDBHEAPBLOCK
  323. JNZ >L2
  324. ADD MAXBHEAPFREE,BHEAPCONTROLBLOCKLENGTH
  325. CMP LASTBHEAPPTR,DI
  326. IF E MOV LASTBHEAPPTR,BX
  327. PUSH BX
  328. MOV BX,DI
  329. CALL INTERN_UNCHAINFREEBLOCK
  330. POP BX
  331. MOV SI,DI
  332. CALL INTERN_CONCATBHEAPBLOCKS
  333. L2:
  334. AND BH_BLOCKFLAGS[BX],BHEAPBLOCKISFREE
  335. CALL INTERN_CHAINFREEBLOCK
  336. CALL INTERN_UPDATEBHEAPHEADER
  337. POP DS,BX,CX,DI,SI
  338. RET
  339. GETBHEAPMEM_A:
  340. MOV ES,CS:BHEAPSEG
  341. GETBHEAPMEM:
  342. CALL INTERN_CHECKBHEAPHEADER
  343. JC RET
  344. TEST CX,_BHEAPFLAGS
  345. PUSHF
  346. AND CX,_NOBHEAPFLAGS
  347. POPF
  348. IF NZ ADD CX,BHEAPCONTROLBLOCKLENGTH
  349. L1:
  350. PUSH DS,DI,SI,CX,DX
  351. PUSH ES
  352. POP DS
  353. MOV AX,CX
  354. CMP AX, MAXBHEAPFREE
  355. JA >L8
  356. TEST BHEAPFLAGS,TRYLASTPTRFIRST
  357. JZ >L1
  358. MOV BX,LASTBHEAPPTR
  359. CMP BX,FREEBHEAPPTR
  360. JE >L1
  361. TEST BH_NEXTBLOCKPTR[BX],ISUSEDBHEAPBLOCK
  362. JNZ >L1
  363. CALL INTERN_GETBHEAPBLOCKLENGTH
  364. CMP AX,CX
  365. JBE >L5
  366. L1:
  367. MOV BX,FREEBHEAPPTR
  368. L0:
  369. OR BX,BX
  370. JE >L8
  371. CALL INTERN_GETBHEAPBLOCKLENGTH
  372. CMP AX,CX
  373. JA >L1
  374. L5:
  375. CALL INTERN_UNCHAINFREEBLOCK
  376. JC >L9
  377. PUSH BX
  378. CALL INTERN_SETNEWBLOCKLENGTH
  379. POP BX
  380. SUB MAXBHEAPFREE,AX
  381. OR BH_BLOCKFLAGS[BX],ISUSEDBHEAPBLOCK
  382. ADD BX,BHEAPCONTROLBLOCKLENGTH
  383. CALL INTERN_UPDATEBHEAPHEADER
  384. JMP >L9
  385. L1:
  386. MOV BX,BH_NEXTFREEPTR[BX]
  387. JMP L0
  388. L8:
  389. MOV AX,BHEAPMEMORYERROR
  390. STC
  391. L9:
  392. POP DX,CX,SI,DI,DS
  393. RET
  394. REPAIRBHEAP_A:
  395. MOV ES,CS:BHEAPSEG
  396. REPAIRBHEAP:
  397. PUSH DS,DI,SI,BX,DX
  398. PUSH ES
  399. POP DS
  400. MOV AX,BHEAPLENGTH
  401. PUSH AX
  402. XOR AL,AH
  403. CMP AL,BHEAPDUMMY
  404. POP AX
  405. JNE >L80
  406. MOV BX,LASTBHEAPPTR
  407. MOV BX,BH_NEXTBLOCKPTR[BX]
  408. AND BX,_NOBHEAPFLAGS
  409. CMP AX,BX
  410. JNE >L80
  411. CALL INTERN_UPDATEBHEAPHEADER
  412. MOV BX,FIRSTBHEAPPTR
  413. XOR SI,SI
  414. L0:
  415. ADD BX,BHEAPCONTROLBLOCKLENGTH
  416. CALL INTERN_CHECKBHEAPBLOCK
  417. JC >L2
  418. SUB BX,BHEAPCONTROLBLOCKLENGTH
  419. MOV DX,BH_NEXTBLOCKPTR[BX]
  420. TEST DX,ISLASTBHEAPBLOCK
  421. JNZ >L1
  422. MOV SI,BX
  423. AND DX,_NOBHEAPFLAGS
  424. XCHG DX,BX
  425. CMP BX,DX
  426. JA L0
  427. JMP >L2
  428. L80:
  429. JMP >L8
  430. L1:
  431. CMP BX,LASTBHEAPPTR
  432. JNE >L2
  433. L90:
  434. CALL INTERN_CALCBHEAPHEADER
  435. JC >L8
  436. JMP >L9
  437. L2:
  438. OR SI,SI
  439. JZ >L8
  440. MOV BX,LASTBHEAPPTR
  441. XOR DI,DI
  442. L0:
  443. ADD BX,BHEAPCONTROLBLOCKLENGTH
  444. CALL INTERN_CHECKBHEAPBLOCK
  445. JC >L2
  446. SUB BX,BHEAPCONTROLBLOCKLENGTH
  447. MOV DI,BX
  448. MOV BX,BH_PREVBLOCKPTR[BX]
  449. CMP DI,BX
  450. JBE >L8
  451. OR BX,BX
  452. JNZ L0
  453. CMP BX,FIRSTBHEAPPTR
  454. JZ L90
  455. L2:
  456. OR DI,DI
  457. JZ >L8
  458. CMP DI,SI
  459. JZ >L8
  460. IF B XCHG DI,SI
  461. MOV BH_PREVBLOCKPTR[DI],SI
  462. MOV BX,SI
  463. MOV BH_NEXTBLOCKPTR[BX],DI
  464. OR BH_BLOCKFLAGS[BX],ISUSEDBHEAPBLOCK
  465. MOV BHEAPFLAGS,0
  466. CALL INTERN_CALCBHEAPHEADER
  467. JC >L8
  468. MOV AX, BHEAPREPAIRED
  469. JMP >L81
  470. L8:
  471. MOV AX,BHEAPFATALERROR
  472. L81:
  473. STC
  474. L9:
  475. POP DX,BX,SI,DI,DS
  476. RET
  477. INTERN_CALCBHEAPHEADER:
  478. XOR AX,AX
  479. MOV MAXBHEAPFREE,AX
  480. MOV LASTBHEAPPTR,AX
  481. MOV FREEBHEAPPTR,AX
  482. MOV BX,FIRSTBHEAPPTR
  483. L0:
  484. CALL INTERN_GETBHEAPBLOCKLENGTH
  485. MOV DX,BH_NEXTBLOCKPTR[BX]
  486. TEST DX,ISUSEDBHEAPBLOCK
  487. JNZ >L1
  488. ADD MAXBHEAPFREE,CX
  489. CALL INTERN_CHAINFREEBLOCK
  490. L1:
  491. TEST DX,ISLASTBHEAPBLOCK
  492. JNZ >L1
  493. AND DX,_NOBHEAPFLAGS
  494. CMP DX,BX
  495. JBE >L01
  496. MOV BX,DX
  497. JMP L0
  498. L01:
  499. MOV AX,BHEAPPOINTERERROR
  500. RET
  501. L1:
  502. MOV LASTBHEAPPTR,BX
  503. INTERN_UPDATEBHEAPHEADER:
  504. CALL INTERN_BUILDHEADERCRC
  505. MOV ES:BHEAPHEADERCRC,AX
  506. CLC
  507. RET
  508. INTERN_BUILDHEADERCRC:
  509. PUSH CX,BX
  510. MOV CX,(OFFSET BHEAPHEADERCRC) - 1
  511. XOR AX,AX
  512. XOR BX,BX
  513. L0:
  514. ADD AL,ES:[BX]
  515. ADC AH,0
  516. INC BX
  517. LOOP L0
  518. POP BX,CX
  519. RET
  520. INTERN_SETNEWBLOCKLENGTH:
  521. PUSH DI
  522. MOV SI,BH_NEXTBLOCKPTR[BX]
  523. SUB CX,AX
  524. JZ >L7
  525. CMP CX,BHEAPCONTROLBLOCKLENGTH
  526. JE >L6
  527. ADD AX,BHEAPCONTROLBLOCKLENGTH
  528. MOV CX,AX
  529. ADD AX,BX
  530. MOV DI,AX
  531. MOV BH_NEXTBLOCKPTR[BX],DI
  532. CMP LASTBHEAPPTR,DI
  533. IF B MOV LASTBHEAPPTR,DI
  534. MOV BH_PREVBLOCKPTR[DI],BX
  535. MOV BH_NEXTBLOCKPTR[DI],SI
  536. XCHG BX,DI
  537. CALL INTERN_CHAINFREEBLOCK
  538. XCHG BX,DI
  539. TEST SI,ISLASTBHEAPBLOCK
  540. JNZ >L6
  541. AND SI,_NOBHEAPFLAGS
  542. MOV BH_PREVBLOCKPTR[SI],DI
  543. L6:
  544. MOV AX,CX
  545. L7:
  546. L9:
  547. POP DI
  548. RET
  549. INTERN_CONCATBHEAPBLOCKS:
  550. PUSH DI
  551. MOV DI,BH_NEXTBLOCKPTR[SI]
  552. MOV BH_NEXTBLOCKPTR[BX],DI
  553. TEST DI,ISLASTBHEAPBLOCK
  554. JNZ >L1
  555. AND DI,_NOBHEAPFLAGS
  556. MOV BH_PREVBLOCKPTR[DI],BX
  557. L1:
  558. POP DI
  559. INTERN_GETBHEAPBLOCKLENGTH:
  560. MOV CX,ES:BH_NEXTBLOCKPTR[BX]
  561. AND CX,_NOBHEAPFLAGS
  562. SUB CX,BX
  563. SUB CX,BHEAPCONTROLBLOCKLENGTH
  564. RET
  565. INTERN_CHECKBHEAPBLOCK:
  566. CALL INTERN_CHECKBHEAPHEADER
  567. JC RET
  568. PUSH BX,SI,DI,DS
  569. PUSH ES
  570. POP DS
  571. SUB BX,BHEAPCONTROLBLOCKLENGTH
  572. TEST BX,_BHEAPFLAGS
  573. JNZ >L8
  574. MOV SI,BH_PREVBLOCKPTR[BX]
  575. MOV DI,BH_NEXTBLOCKPTR[BX]
  576. OR SI,SI
  577. JZ >L1
  578. CMP BX,SI
  579. JBE >L8
  580. MOV AX,BH_NEXTBLOCKPTR[SI]
  581. AND AX,_NOBHEAPFLAGS
  582. CMP AX,BX
  583. JNZ >L8
  584. L1:
  585. TEST DI,ISUSEDBHEAPBLOCK
  586. JNZ >L1
  587. CALL INTERN_CHECKFREEBLOCK
  588. JC >L9
  589. L1:
  590. TEST DI,ISLASTBHEAPBLOCK
  591. JNZ >L1
  592. AND DI,_NOBHEAPFLAGS
  593. CMP BX,DI
  594. JAE >L8
  595. MOV AX,BH_PREVBLOCKPTR[DI]
  596. CMP AX,BX
  597. JNZ >L8
  598. L1:
  599. CLC
  600. L9:
  601. POP DS,DI,SI,BX
  602. RET
  603. L8:
  604. STC
  605. MOV AX,BHEAPPOINTERERROR
  606. JMP L9
  607. INTERN_CHECKBHEAPHEADER:
  608. CALL INTERN_BUILDHEADERCRC
  609. CMP ES:BHEAPHEADERCRC,AX
  610. JZ RET
  611. MOV AX,BHEAPFATALERROR
  612. STC
  613. RET
  614. INTERN_CHECKFREEBLOCK:
  615. PUSH SI
  616. MOV SI,BH_PREVFREEPTR[BX]
  617. OR SI,SI
  618. JZ >L1
  619. CMP BH_NEXTFREEPTR[SI],BX
  620. JNZ >L8
  621. L1:
  622. MOV SI,BH_NEXTFREEPTR[BX]
  623. OR SI,SI
  624. JZ >L1
  625. CMP BH_PREVFREEPTR[SI],BX
  626. JNZ >L8
  627. L1:
  628. JMP >L9
  629. L8:
  630. MOV AX,BHEAPFPOINTERERROR
  631. STC
  632. L9:
  633. POP SI
  634. RET
  635. INTERN_UNCHAINFREEBLOCK:
  636. CALL INTERN_CHECKFREEBLOCK
  637. JC RET
  638. PUSH SI,DI
  639. MOV SI,BH_PREVFREEPTR[BX]
  640. MOV DI,BH_NEXTFREEPTR[BX]
  641. OR SI,SI
  642. JNZ >L1
  643. MOV FREEBHEAPPTR,DI
  644. JMP >L2
  645. L1:
  646. MOV BH_NEXTFREEPTR[SI],DI
  647. L2:
  648. OR DI,DI
  649. JZ >L1
  650. MOV BH_PREVFREEPTR[DI],SI
  651. L1:
  652. CLC
  653. POP DI,SI
  654. RET
  655. INTERN_CHAINFREEBLOCK:
  656. PUSH SI
  657. MOV SI,FREEBHEAPPTR
  658. OR SI,SI
  659. JNZ >L1
  660. MOV BH_PREVFREEPTR[BX],SI
  661. MOV BH_NEXTFREEPTR[BX],SI
  662. JMP >L9
  663. L1:
  664. MOV BH_NEXTFREEPTR[BX],SI
  665. MOV BH_PREVFREEPTR[BX],0
  666. MOV BH_PREVFREEPTR[SI],BX
  667. L9:
  668. MOV FREEBHEAPPTR,BX
  669. CLC
  670. POP SI
  671. RET
  672. #IF !INTERN_CMARK0
  673. INTERN_CMARK0 EQU 01H
  674. INTERN_CMARK1:
  675. PUSH BP
  676. MOV BP,SP
  677. MOV BX,06H
  678. SUB CH,[BP+SI]
  679. SUB AH,[BX+SI]
  680. DEC SP
  681. DEC CX
  682. INC DX
  683. XOR AL,041H
  684. CMP B[02820H],DH
  685. INC BX
  686. SUB W[BX+SI],SP
  687. INC DX
  688. CS AND B[BP+DI+043H],DL
  689. DEC AX
  690. INC BP
  691. DEC BP
  692. DEC BP
  693. INC BP
  694. PUSH DX
  695. AND B[BP+SI],CH
  696. SUB CH,[BP+SI]
  697. POP DX
  698. MOV SP,BP
  699. POP BP
  700. RET
  701. #ENDIF
  702.